/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.dao;

import br.com.dao.util.GenericDao;
import br.com.model.Filme;
import br.com.type.Genero;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Hercules Sandim
 */
public class FilmeDao implements GenericDao<Filme> 
{

    private Connection connection;

    public FilmeDao(Connection connection) {
        this.connection = connection;
    }
    
    @Override
    public void save(Filme filme) {

        try
        {
            Integer id;
            String sql = "select max(id) as mx from filme"; //Funciona para PostgreSQL
            
            PreparedStatement stmt = this.connection.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            rs.next();
            id = rs.getInt("mx");
            
            id = id + 1;
                    
            sql="insert into filme " +
                    " (id,titulooriginal, tituloportugues,ano,duracaominutos,genero,ehlancamento,sinopse) "+
                    " values (?,?,?,?,?,?,?,?)"  ;
            
            stmt = this.connection.prepareStatement(sql);
            stmt.setInt(1, id);
            stmt.setString(2, filme.getTituloOriginal());
            stmt.setString(3, filme.getTituloPortugues());            
            stmt.setInt(4, filme.getAno());            
            stmt.setInt(5, filme.getDuracaoMinutos());            
            stmt.setString(6, filme.getGenero().name());            
            stmt.setBoolean(7, filme.isEhLancamento());
            stmt.setString(8, filme.getSinopse());
            stmt.executeUpdate();
            
            sql="insert into filme_atores(id_filme, ator)" +
                            " values (?,?)";
            stmt = this.connection.prepareStatement(sql);                        
            for(int i=0;i<filme.getAtores().toArray().length;i++)
            {
                    stmt.setInt(1,id);
                    stmt.setString(2, filme.getAtores().toArray()[i].toString());
                    stmt.executeUpdate();                    
            }   
            
            sql="insert into filme_diretores(id_filme, diretor)" +
                            " values (?,?)";
            stmt = this.connection.prepareStatement(sql);                        
            for(int i=0;i<filme.getDiretores().toArray().length;i++)
            {
                    stmt.setInt(1,id);
                    stmt.setString(2, filme.getDiretores().toArray()[i].toString());
                    stmt.executeUpdate();                    
            }
            
            sql="insert into filme_paises(id_filme, pais)" +
                            " values (?,?)";
            stmt = this.connection.prepareStatement(sql);                        
            for(int i=0;i<filme.getPaises().toArray().length;i++)
            {
                    stmt.setInt(1,id);
                    stmt.setString(2, filme.getPaises().toArray()[i].toString());
                    stmt.executeUpdate();                    
            }
            
            
        }
        catch (SQLException e)
        {
                e.printStackTrace();
        }
        
    }

    @Override
    public void delete(Filme filme) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public LinkedList<Filme> list() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Filme findById(Integer id) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public LinkedList<Filme> listar() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public LinkedList<Filme> getObjectByName(String name){

        int id;
        PreparedStatement stmt;
        LinkedList<Filme> listFilmes = new LinkedList<Filme>();

        String sql = "select id, titulooriginal, tituloportugues, ano, duracaominutos, genero, ehlancamento, sinopse FROM filme WHERE titulooriginal like '%" + name + "%' or tituloportugues like '%" + name + "%'";

        try {

            stmt = this.connection.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while(rs.next()){
                Filme tempfilme = null;
                String titulooriginal = "";
                String tituloportugues = "";
                LinkedList<String> paises = null;
                Integer ano = 0;
                LinkedList<String> diretores = null;
                LinkedList<String> atores = null;
                String sinopse = "";
                Integer duracaominutos = 0;
                Genero genero;
                boolean ehLancamento;
            
                id = rs.getInt(1);
                titulooriginal = rs.getString(2);
                tituloportugues = rs.getString(3);
                ano = rs.getInt(4);
                duracaominutos = rs.getInt(5);
                genero = Genero.valueOf(rs.getString(6));
                ehLancamento = rs.getBoolean(7);
                sinopse = rs.getString(8);

                String sql2 = "select ator FROM filme_atores WHERE id_filme = '" + id + "'";
                PreparedStatement stmt2;
                stmt2 = this.connection.prepareStatement(sql2);
                ResultSet rs2 = stmt2.executeQuery();
                atores = new LinkedList<String>();
                while (rs2.next()) {
                    atores.add(rs2.getString(1));
                }

                String sql3 = "select diretor FROM filme_diretores WHERE id_filme = '" + id + "'";
                PreparedStatement stmt3;
                stmt3 = this.connection.prepareStatement(sql3);
                ResultSet rs3 = stmt3.executeQuery();
                diretores = new LinkedList<String>();
                while (rs3.next()) {
                    diretores.add(rs3.getString(1));
                }

                String sql4 = "select pais FROM filme_paises WHERE id_filme = '" + id + "'";
                PreparedStatement stmt4;
                stmt4 = this.connection.prepareStatement(sql4);
                ResultSet rs4 = stmt4.executeQuery();
                paises = new LinkedList<String>();
                while (rs4.next()) {
                    paises.add(rs4.getString(1));
                }

                tempfilme = new Filme(id,titulooriginal, tituloportugues, paises, ano, diretores, atores, sinopse, duracaominutos, genero, ehLancamento);
                listFilmes.add(tempfilme);
            }
        } catch (SQLException ex) {
            Logger.getLogger(FilmeDao.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        return listFilmes;
    }
    
    @Override
    public Filme getObjectById(Integer id) {
     
        String titulooriginal;
        String tituloportugues;
        LinkedList<String> paises = null;
        Integer ano;
        LinkedList<String> diretores = null;
        LinkedList<String> atores = null;
        String sinopse;
        Integer duracaominutos;
        Genero genero;
        boolean ehLancamento;


        String sql = "select id, titulooriginal, tituloportugues, ano, duracaominutos, genero, ehlancamento, sinopse FROM filme WHERE id = '" + id + "'";
        
        PreparedStatement stmt;
        Filme tempfilme = null;

        try {
            stmt = this.connection.prepareStatement(sql);
            System.out.println(stmt);
            ResultSet rs = stmt.executeQuery();
            rs.next();
            System.out.println(rs.getString(2));
            id = rs.getInt(1);
            titulooriginal = rs.getString(2);
            tituloportugues = rs.getString(3);
            ano = rs.getInt(4);
            duracaominutos = rs.getInt(5);
            genero = Genero.valueOf(rs.getString(6));
            ehLancamento = rs.getBoolean(7);
            sinopse = rs.getString(8);
            String sql2 = "select ator FROM filme_atores WHERE id_filme = '" + id + "'";
            PreparedStatement stmt2;
            stmt2 = this.connection.prepareStatement(sql2);
            ResultSet rs2 = stmt2.executeQuery();
            
            atores = new LinkedList<String>();
            while (rs2.next()) {
                atores.add(rs2.getString(1));
            }

            String sql3 = "select diretor FROM filme_diretores WHERE id_filme = '" + id + "'";
            PreparedStatement stmt3;
            stmt3 = this.connection.prepareStatement(sql3);
            ResultSet rs3 = stmt3.executeQuery();
            
            diretores = new LinkedList<String>();
            while (rs3.next()) {
                diretores.add(rs3.getString(1));
            }

            String sql4 = "select pais FROM filme_paises WHERE id_filme = '" + id + "'";

            PreparedStatement stmt4;
            stmt4 = this.connection.prepareStatement(sql4);
            ResultSet rs4 = stmt4.executeQuery();
            
            paises = new LinkedList<String>();
            while (rs4.next()) {
                paises.add(rs4.getString(1));
            }
            
            tempfilme = new Filme(id,titulooriginal, tituloportugues, paises, ano, diretores, atores, sinopse, duracaominutos, genero, ehLancamento);

            return tempfilme;

        } catch (SQLException ex) {
            Logger.getLogger(FilmeDao.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }   
}